# D:\dazuoye\app\data_loader.py

import pandas as pd
import os
import ast  # 引入ast库，用于安全地解析字符串

BASE_DIR = r'D:\dazuoye'
RAW_DATA_DIR = os.path.join(BASE_DIR, 'data', 'raw')

# 缓存数据的全局变量
time_series_data, radar_data, campaign_data, social_media_data, prediction_data = (None,) * 5
sales_performance_data, regional_sales_data, customer_purchase_data, customer_churn_data = (None,) * 4


def prepare_all_data():
    global time_series_data, radar_data, campaign_data, social_media_data, prediction_data, sales_performance_data, regional_sales_data, customer_purchase_data, customer_churn_data
    try:
        # 定义所有需要使用的真实数据文件路径
        social_media_file = os.path.join(RAW_DATA_DIR, '社交媒体提及与情感分析数据.xlsx')
        formula_file = os.path.join(RAW_DATA_DIR, '香氛产品配方与市场反馈数据.xlsx')
        preference_survey_file = os.path.join(RAW_DATA_DIR, '消费者偏好调研数据.xlsx')
        campaign_file = os.path.join(RAW_DATA_DIR, '营销活动投入与效果数据.xlsx')
        prediction_file = os.path.join(RAW_DATA_DIR, '市场需求预测模型数据.xlsx')
        sales_performance_file = os.path.join(RAW_DATA_DIR, '各销售渠道销售业绩数据.xlsx')
        regional_sales_file = os.path.join(RAW_DATA_DIR, '区域市场销售分布数据.xlsx')
        customer_purchase_file = os.path.join(RAW_DATA_DIR, '客户购买记录与满意度评分数据.xlsx')
        customer_churn_file = os.path.join(RAW_DATA_DIR, '客户流失预警模型数据.xlsx')

        # --- 开始加载所有真实数据 ---
        df_social = pd.read_excel(social_media_file)
        social_media_data = df_social.copy()
        print("社交媒体数据已准备")

        df_formula = pd.read_excel(formula_file)

        # ==================== 【关键修改区域开始】 ====================
        print("⏳ 正在处理【时间序列图】数据...")

        # 1. 合并数据表
        merged_df = pd.merge(df_social, df_formula[['产品ID', '主要香调']], on='产品ID', how='left')
        merged_df.dropna(subset=['主要香调'], inplace=True)
        merged_df['日期'] = pd.to_datetime(merged_df['日期'])

        # 2. 定义一个函数，用于解析包含香调列表的字符串
        def parse_notes(note_string):
            try:
                # 使用 ast.literal_eval 安全地将字符串转换为Python列表对象
                notes_list = ast.literal_eval(note_string)
                # 提取列表中每个字典的'香调'值
                return [note['香调'] for note in notes_list]
            except (ValueError, SyntaxError):
                # 如果解析失败（例如格式错误或单元格为空），则返回空列表
                return []

        # 3. 将上述函数应用到'主要香调'列，生成一个包含香调名称列表的新列
        merged_df['香调列表'] = merged_df['主要香调'].apply(parse_notes)

        # 4. 使用 explode 方法，将'香调列表'中的每个元素拆分成独立的行
        df_exploded = merged_df.explode('香调列表')

        # 5. 按日期和拆分后的独立香调进行分组，并计算提及次数的总和
        time_series_final = df_exploded.groupby(['日期', '香调列表'])['提及次数'].sum().reset_index()

        # 6. 将列名改回 '主要香调'，以确保 task1_trends.py 无需修改即可正常工作
        time_series_data = time_series_final.rename(columns={'香调列表': '主要香调'})

        print("【时间序列图】数据已准备 ")
        # ==================== 【关键修改区域结束】 ====================

        radar_data = pd.read_excel(preference_survey_file)
        print("【雷达图】数据已准备")

        campaign_data = pd.read_excel(campaign_file)
        print("【营销活动】数据已准备")

        prediction_data = pd.read_excel(prediction_file)
        print("【需求预测】数据已准备")

        sales_performance_data = pd.read_excel(sales_performance_file)
        print("【销售渠道业绩】数据已准备")

        regional_sales_data = pd.read_excel(regional_sales_file)
        print("【区域市场销售】数据已准备")

        customer_purchase_data = pd.read_excel(customer_purchase_file)
        print("【客户购买记录】数据已准备")

        customer_churn_data = pd.read_excel(customer_churn_file)
        print("【客户流失预警】数据已准备")

        return True

    except Exception as e:
        print(f"❌ 数据加载时发生错误: {e}")
        return False